/*
 * Copyright (c) [2020] Huawei Technologies Co.,Ltd.All rights reserved.
 *
 * OpenArkCompiler is licensed under Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *
 *     http://license.coscl.org.cn/MulanPSL2
 *
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR
 * FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 */
#ifndef MAPLE_RUNTIME_IMPORTED_H
#define MAPLE_RUNTIME_IMPORTED_H

#include "address.h"

namespace maplert {
//  This file include imported symbols from a specific build of the application.
//
//  Currently, the imported symbols include:
//
//  -   __MRT_GCRootList: List of GC roots.
//  -   __MRT_PrimordialObjectList: List of primordial objects
//
// DO NOT MAKE THE SYMBOLS BELOW WEAK!  They are necessary for the proper
// execution of the program.  If there is a linking error, it means the
// application buildilng script does not properly provide the GC root list.  The
// building script needs to be fixed.  If we make the list empty "by default",
// we may silently ignore a class of building mistakes.
//
// The two global variables are global roots provided by the application.
// Tracing collectors, including the back-up tracer which is currently used in
// the RC collector for cleaning up, work by starting tracing the heap from
// global GC roots and computing its transitive closure.
//
// They are defined in unified.groots.s, which is generated by the script
// mapleall/maplebe/collect/mpl-collect-groot-lists.  That script contains
// detailed instruction about how to generate the unified.groots.s file.
//
// After generating, assemble and link the unified.groots.s into the executable
// or the shared object.
//
// If you are writing test cases, you can manually define the two lists to
// manually specify GC roots.  If you don't have GC roots in your test case,
// make an empty list.
//
// A list of global GC roots.  For Java, it is the complete list of static
// variables of reference types.
extern "C" address_t *gcRootNewList[];

// The length of the __MRT_GCRootList array.
extern "C" size_t gcRootNewListSize;
}

#endif
